home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d1 / eddtv4.arc / ESETUP40.ASM < prev    next >
Assembly Source File  |  1988-03-28  |  26KB  |  644 lines

  1.          .XLIST
  2.          PAGE  80,120
  3.          EXTRN  CMOSREAD:FAR
  4.          EXTRN  CMOSWRIT:FAR
  5.          EXTRN  CMOSCHKS:FAR
  6.          IF1
  7.          PAGE
  8.          INCLUDE EDDT_MAC.LIB
  9.          ENDIF
  10.          PAGE
  11.          TITLE OèÄ EDDT - EXTENDED DRIVE SETUP PROGRAM Version 4.00ö
  12.          .LIST
  13.          .286                     ; ENABLE 80286 INSTRUCTIONS
  14.          SUBTTL ROUTINE TO ALLOW EXTENDED DRIVE DESCRIPTIONS
  15.          COMMENT *
  16.  
  17.          EDSETUP VERSION 4.00
  18.  
  19.          Copyright 1987,1988 Don Gentry
  20.  
  21.          A limited license is granted to all users of this program,
  22.          to make copies of this program, and distribute them to
  23.          other users, on the following conditions:
  24.  
  25.          1. The notice on this page is not to be removed or altered
  26.  
  27.          2. No fee is to be charged for copying or distributing
  28.             the program.
  29.  
  30.          3. No warranty of any kind is offered. This program is offered
  31.             on an "AS IS" basis. Each user should verify that it meets
  32.             his needs and verify correct operation.
  33.  
  34.          4. No further restrictions on redristribution of any kind may
  35.             be required. This includes, but is not limited to,
  36.             COMPUSERVE or other program distribution services,
  37.             by electronic or other means.
  38.  
  39.          FOR HELP OR SUGGESTIONS WRITE:
  40.  
  41.          DON GENTRY
  42.          183 BELLEGROVE CIRCLE
  43.          BRANDON, MS  39042
  44.  
  45.          OR CALL (601) 992-0577
  46.                                                                 *
  47.          PAGE
  48. ED_STACK SEGMENT PARA STACK 'STACK'
  49.          DB    200 DUP('STACK')
  50. ED_STAK0 EQU   $                  ; START OF STACK
  51. ED_STACK ENDS
  52. ED_DATA  SEGMENT PARA PUBLIC 'DATA'  ; CODE SEGMENT
  53.          DB    7                  ; LENGTH OF ID
  54.          DB    'EDSETUP'          ; PROGRAM ID
  55.          DB    'V4M00'            ; VERSION/MODIFICATION LEVEL
  56. ;
  57. ; ----- DEFINE MESSAGE SCREENS
  58. ED_LOGO1 EQU   $
  59.          DFLD  01,20,15,'EDDT - EXTENDED DRIVE DESCRIPTION TABLES'
  60. ED_LOGO2 EQU   $
  61.          DFLD  02,26,15,'EXTENDED DRIVE SETUP PROGRAM'
  62. ED_LOGO3 EQU   $
  63.          DFLD  03,25,07,'COPYRIGHT 1987,1988 DON GENTRY'
  64. ED_NOTE1 EQU   $
  65.          DFLD  05,22,70H,'NOTE: SET TYPE TO 00 IF NOT INSTALLED'
  66. ED_HD0   EQU   $
  67.          DFLD  07,25,07,'ENTER TYPE FOR HARD DRIVE 0:    '
  68. ED_HD0IN EQU   $
  69.          DFLD  07,54,07H,'   '
  70. ED_HD1   EQU   $
  71.          DFLD  09,25,07,'ENTER TYPE FOR HARD DRIVE 1:    '
  72. ED_HD1IN EQU   $
  73.          DFLD  09,54,07H,'   '
  74. ED_FD0   EQU   $
  75.          DFLD  12,24,07,'ENTER TYPE FOR FLOPPY DRIVE 0:   '
  76. ED_FD0IN EQU   $
  77.          DFLD  12,55,07H,'  '
  78. ED_FD1   EQU   $
  79.          DFLD  14,24,07,'ENTER TYPE FOR FLOPPY DRIVE 1:   '
  80. ED_FD1IN EQU   $
  81.          DFLD  14,55,07H,'  '
  82. ED_NOTE2 EQU   $
  83.          DFLD  16,25,07,'VALID FLOPPY DRIVE TYPES ARE:'
  84. ED_NOTE3 EQU   $
  85.          DFLD  17,21,07
  86.          DW    ED_N3B-ED_N3A
  87. ED_N3A   DB    '1 - 360KB 5.25       2 - 1.2MB 5.25'
  88.          DB    0AH,0DH,'                     '
  89.          DB    '3 - 720KB 3.5        4 - 1.44MB 3.25'
  90. ED_N3B   EQU   $
  91. ED_CONF  EQU   $
  92.          DFLD  23,24,15,'ACCEPT DRIVE TYPES SELECTED (Y/N)'
  93. ED_BOOT  EQU   $
  94.          DFLD  22,20,15,'NOTE: RE-BOOT TO MAKE CHANGES EFFECTIVE'
  95. ED_INVM1 EQU   $
  96.          DFLD  10,28,15,'INVALID MACHINE DETECTED'
  97. ED_INVM2 EQU   $
  98.          DFLD  24,20,15,'SETUP MUST BE RUN ON AN AT OR COMPATIBLE'
  99. ED_INVM3 EQU   $
  100.          DFLD  24,19,15,'BIOS REQUIRES FLOPPY DRIVE 0 INSTALLATION'
  101. ED_INVMB EQU   $
  102.          DFLD  24,19,15,'                                         '
  103. ;
  104. ; ----- PROGRAM CONSTANT AREAS
  105. ;
  106. ED_CMOS  EQU   $                  ; CMOS I/O AREA
  107. ED_ETYP0 EQU   019H               ; EDDT DRIVE 0 TYPE CMOS BYTE
  108. ED_ETYP1 EQU   01AH               ; EDDT DRIVE 1 TYPE CMOS BYTE
  109. ED_FDTYP DB    0                  ; FLOPPY DISK DRIVES
  110.          DB    0                  ; RESERVED
  111. ED_HDTYP DB    0                  ; BIOS DRIVE TYPES 1-14
  112.          DB    0                  ; RESERVED
  113. ED_EQ    DB    0                  ; EQUIPMENT BYTE
  114. ED_MBML  DB    0                  ; MOTHER BOARD MEMORY LOW BYTE
  115. ED_MBMH  DB    0                  ; MOTHER BOARD MEMORY HI BYTE
  116. ED_EXML  DB    0                  ; EXPANSION MEMORY LOW BYTE
  117. ED_EXMH  DB    0                  ; EXPANSION MEMORY HI BYTE
  118. ED_HD0E  DB    0                  ; HARD DRIVE 0 EXTENDED TYPE
  119. ED_HD1E  DB    0                  ; HARD DRIVE 1 EXTENDED TYPE
  120.          DB    19 DUP(0)          ; RESERVED
  121. ED_CHKSL DB    0                  ; CHECKSUM BYTE LOW
  122. ED_CHKSH DB    0                  ; CHECKSUM BYTE HI
  123. ;
  124. ; -----  INPUT BUFFER FOR HARD DRIVE 0
  125. ;
  126. ED_HD0BF DB    04                 ; NUMBER OF CHARS TO ACCEPT
  127. ED_HD0BL DB    00                 ; NUMBER OF CHARS READ
  128. ED_HD0BD DB    00,00,00,00        ; BUFFER DATA AREA
  129. ;
  130. ; -----  INPUT BUFFER FOR HARD DRIVE 1
  131. ;
  132. ED_HD1BF DB    04                 ; NUMBER OF CHARS TO ACCEPT
  133. ED_HD1BL DB    00                 ; NUMBER OF CHARS READ
  134. ED_HD1BD DB    00,00,00,00        ; BUFFER DATA AREA
  135. ;
  136. ; -----  INPUT BUFFER FOR FLOPPY DRIVE 0
  137. ;
  138. ED_FD0BF DB    02                 ; NUMBER OF CHARS TO ACCEPT
  139. ED_FD0BL DB    00                 ; NUMBER OF CHARS READ
  140. ED_FD0BD DB    00,00              ; BUFFER DATA AREA
  141. ;
  142. ; -----  INPUT BUFFER FOR FLOPPY DRIVE 1
  143. ;
  144. ED_FD1BF DB    02                 ; NUMBER OF CHARS TO ACCEPT
  145. ED_FD1BL DB    00                 ; NUMBER OF CHARS READ
  146. ED_FD1BD DB    00,00              ; BUFFER DATA AREA
  147. ;
  148. ; -----  COPY THE EDDT EXTENDED DRIVE TABLE
  149. ;
  150.          .XLIST
  151.          INCLUDE EDDTBL40.ASM     ; INCLUDE THE DRIVE TABLE
  152.          .LIST
  153. ED_DATA  ENDS
  154. ;
  155. ED_CODE  SEGMENT PARA PUBLIC 'CODE'  ; CODE SEGMENT
  156.          ASSUME CS:ED_CODE,DS:ED_DATA,ES:NOTHING,SS:ED_STACK
  157. ED_MAIN  PROC  FAR                ; DEFINE PROCEDURE
  158. ED_START:
  159.          MOV   AX,ED_DATA         ; GET ADDRESS OF DATA SEGMENT
  160.          MOV   DS,AX              ; PUT IN DS REG
  161. ;
  162. ; ----- MAKE SURE WE'RE RUNNING ON AN AT
  163. ;
  164.          MOV   AX,0FFFFH          ; GET LAST SEGMENT ADDRESS
  165.          MOV   ES,AX              ;   IN ES REGISTER
  166.          MOV   AL,ES:[0EH]        ; GET MODEL_BYTE
  167.          CMP   AL,0FCH            ; GOOD AT TYPE ?
  168.          JE    ED_MODOK           ; ...YES - CONTINUE
  169.          CMP   AL,0FBH            ; GOOD AT TYPE ?
  170.          JE    ED_MODOK           ; ...YES - CONTINUE
  171.          CLS                      ; CLEAR THE SCREEN
  172. ;
  173.          WCS   ED_INVM1           ; WRITE ERROR MESSAGE 1
  174. ;
  175.          WCS   ED_INVM2           ; WRITE ERROR MESSAGE 2
  176. ;
  177.          MOV   BX,4               ; BEEP COUNT
  178.          CALL  ED_BEEP            ; BEEEEEEEP!
  179.          JMP   ED_EXIT            ; AND EXIT TO DOS
  180. ED_MODOK:
  181. ;
  182. ; -----  READ CMOS CONFIGURATION MEMORY
  183. ;
  184.          LEA   DX,ED_CMOS         ; GET ADDRESS OF CMOS I/O AREA
  185.          CALL  CMOSREAD           ; READ THE CMOS
  186. ;
  187. ; -----  PAINT THE INITIAL SCREEN
  188. ;
  189. ED_GO:
  190.          CLS                      ; CLEAR THE SCREEN
  191. ;
  192.          WCS   ED_LOGO1           ; WRITE LOGO 1 MESSAGE
  193. ;
  194.          WCS   ED_LOGO2           ; WRITE LOGO 2 MESSAGE
  195. ;
  196.          WCS   ED_LOGO3           ; WRITE LOGO 3 MESSAGE
  197. ;
  198.          WCS   ED_HD0             ; WRITE HD0 MESSAGE
  199. ;
  200.          WCS   ED_HD0IN           ; WRITE HD0 INPUT FIELD
  201. ;
  202.          WCS   ED_HD1             ; WRITE HD1 MESSAGE
  203. ;
  204.          WCS   ED_HD1IN           ; WRITE HD1 INPUT FIELD
  205. ;
  206.          WCS   ED_FD0             ; WRITE FD0 MESSAGE
  207. ;
  208.          WCS   ED_FD0IN           ; WRITE FD0 INPUT FIELD
  209. ;
  210.          WCS   ED_FD1             ; WRITE FD1 MESSAGE
  211. ;
  212.          WCS   ED_FD1IN           ; WRITE FD1 INPUT FIELD
  213. ;
  214.          WCS   ED_NOTE1           ; WRITE NOTE 1
  215. ;
  216.          WCS   ED_NOTE2           ; WRITE NOTE 2
  217. ;
  218.          WCS   ED_NOTE3           ; WRITE NOTE 3
  219. ;
  220.          WCS   ED_BOOT            ; WRITE BOOT NOTE
  221. ;
  222. ; -----  READ THE TYPE FOR HARD DRIVE 0
  223. ;
  224.          CSRP  ED_HD0IN           ; POSITION CURSOR FOR INPUT
  225. ;
  226. ED_HD0RD:                         ; READ THE TYPE
  227.          READK ED_HD0BF           ; WAIT FOR INPUT
  228. ;
  229. ; -----  VALIDATE THE TYPE FOR HARD DRIVE 0
  230. ;
  231.          CMP   ED_HD0BL,00H       ; ONLY CARRIAGE RETURN ENTERED ?
  232.          JNE   ED_HD001           ; ...NO - CONTINUE
  233. ED_HD0E1:                         ; ERROR ROUTINE
  234.          MOV   BX,02H             ; BEEP DURATION
  235.          CALL  ED_BEEP            ; SOUND BEEP
  236.          WCS   ED_HD0IN           ; CLEAR THE FIELD
  237.          CSRP  ED_HD0IN           ; POSITION CURSOR
  238.          JMP   ED_HD0RD
  239. ED_HD001:
  240.          CMP   ED_HD0BL,01H       ; ONLY ONE CHARACTER ENTERED ?
  241.          JNE   ED_HD002           ; ...NO - CONTINUE
  242. ;
  243. ; -----  ZERO FILL THE LEADING BYTES IN THE BUFFER
  244. ;
  245.          MOV   AH,ED_HD0BD        ; GET THE DATA BYTE IN AH
  246.          MOV   WORD PTR ED_HD0BD,'00'  ; LEADING ZERO FILL
  247.          MOV   ED_HD0BD+2,AH      ; PUT THE CHAR IN BFR
  248. ED_HD002:
  249.          CMP   ED_HD0BL,02H       ; ONLY TWO CHARACTER ENTERED ?
  250.          JNE   ED_HD003           ; ...NO - CONTINUE
  251. ;
  252. ; -----  ZERO FILL THE LEADING BYTES IN THE BUFFER
  253. ;
  254.          MOV   AX,WORD PTR ED_HD0BD ; GET THE DATA BYTES IN AX
  255.          MOV   ED_HD0BD,'0'       ; LEADING ZERO FILL
  256.          MOV   WORD PTR ED_HD0BD+1,AX ; DATA BACK TO BUFFER
  257. ED_HD003:
  258. ;
  259. ; -----  VALIDATE THE CHARACTERS IN THE BUFFER
  260. ;
  261.          CMP   ED_HD0BD,'0'       ; IS IT LESS THAN '0'
  262.          JB    ED_HD0E1           ; ...YES - GO TO ERROR ROUTINE
  263.          CMP   ED_HD0BD,'2'       ; GREATER THAN 2 ?
  264.          JA    ED_HD0E1           ; ...YES - ERROR
  265. ;
  266.          CMP   ED_HD0BD+1,'0'     ; IS IT LESS THAN '0'
  267.          JB    ED_HD0E1           ; ...YES - GO TO ERROR ROUTINE
  268.          CMP   ED_HD0BD+1,'9'     ; GREATER THAN 9 ?
  269.          JA    ED_HD0E1           ; ...YES - ERROR
  270. ;
  271.          CMP   ED_HD0BD+2,'0'     ; IS IT LESS THAN '0'
  272.          JB    ED_HD0E1           ; ...YES - GO TO ERROR ROUTINE
  273.          CMP   ED_HD0BD+2,'9'     ; GREATER THAN 9 ?
  274.          JLE   ED_HD004           ; ...NO - CONTINUE
  275.          JMP   ED_HD0E1           ; ...YES - ERROR
  276. ED_HD004:
  277. ;
  278. ; -----  DIGITS ARE GOOD, CONVERT TO BINARY
  279. ;
  280.          MOV  AX,WORD PTR ED_HD0BD+1 ; GET ASCII LOW 2 BYTES
  281.          CALL  ED_CVB             ; CONVERT TO BINARY
  282.          CMP   ED_HD0BD,'2'       ; HIGH DIGIT 2 ?
  283.          JNE   ED_HD005           ; ...NO - CONTINUE
  284.          ADD   AX,200D            ; ...YES - ADD 200
  285. ED_HD005:
  286.          CMP   ED_HD0BD,'1'       ; HIGH DIGIT A 1
  287.          JNE   ED_HD006           ; ...NO - CONTINUE
  288.          ADD   AX,100D            ; YES - ADD 100
  289. ED_HD006:
  290. ;
  291.          CMP   AX,15              ; DRIVE TYPE 15 SPECIFIED ?
  292.          JNE   ED_HD007           ; ...NO - CONTINUE
  293.          JMP   ED_HD0E1           ; ...YES - ERROR
  294. ED_HD007:
  295.          CMP   AX,ED_MAXE-1       ; TYPE GT MAX EDDT TYPE ?
  296.          JLE   ED_HD009           ; ...NO - CONTINUE
  297.          JMP   ED_HD0E1           ; ...YES - ERROR
  298. ED_HD009:
  299. ;
  300. ; -----  SET THE DRIVE TYPE IN CMOS
  301. ;
  302.          MOV   ED_HD0E,AL         ; SET THE EDDT EXTENDED TYPE
  303. ;-------------------------------------------------------------- 03/12/88
  304. ;                                                               03/12/88
  305. ;        NOTE:                                                  03/12/88
  306. ;              IN ORDER TO INITIALIZE INTERRUPT 13H ON SOME     03/12/88
  307. ;              AT COMPATIBLES FIXED DRIVE 0 MUST BE DEFINED     03/12/88
  308. ;              IN CMOS. SINCE THE ACTUAL DRIVE MAY NOT HAVE     03/12/88
  309. ;              A CORRESPONDING IBM DRIVE TYPE WE MUST PICK      03/12/88
  310. ;              ONE THAT MEETS THE FOLLOWING CRITERIA:           03/12/88
  311. ;                                                               03/12/88
  312. ;              (1) THE TYPE DEFINED MUST HAVE LESS THAT OR      03/12/88
  313. ;                  EQUAL TO THE PHYSICAL DRIVE'S NUMBER OF      03/12/88
  314. ;                  HEADS _AND_ NUMBER OF CYLINDERS.             03/12/88
  315. ;                                                               03/12/88
  316. ;              (2) IF THE PHYSICAL DRIVE HAS MORE THAN 8        03/12/88
  317. ;                  HEADS THE TYPE USED MUST HAVE A CONTROL      03/12/88
  318. ;                  BYTE VALUE OF 08H OR IT MUST NOT USE         03/12/88
  319. ;                  WRITE PRECOMPENSATION.                       03/12/88
  320. ;-------------------------------------------------------------- 03/12/88
  321. ;
  322. ; -----  LOCATE THE TABLE ENTRY FOR FIXED DRIVE 0               03/12/88
  323. ;                                                               03/12/88
  324.          XOR   BX,BX              ; CLEAR BX                    03/12/88
  325.          MOV   BL,AL              ; GET DRIVE TYPE FOR DRIVE 0  03/12/88
  326.          DEC   BX                 ; ADJUST FOR TABLE BASE       03/12/88
  327.          SHL   BX,04H             ; *10H FOR TABLE OFFSET       03/12/88
  328.          MOV   AL,BYTE PTR ED_TABLE+2[BX] ; GET NUMBER OF HEADS 03/12/88
  329.          CMP   AL,09H             ; NINE OR MORE HEADS ?        03/12/88
  330.          JNL   ED_HDGT8           ; ...YES - GO ADJUST          03/12/88
  331.          MOV   ED_HDTYP,10H       ; SET DRIVE 0 TO BIOS TYPE 1  03/12/88
  332.          JMP   ED_HD1GO           ; DO DRIVE 1                  03/12/88
  333. ED_HDGT8:                         ;                             03/12/88
  334.          MOV   ED_HDTYP,60H       ; SET DRIVE 0 TO BIOS TYPE 6  03/12/88
  335. ED_HD1GO:                         ;                             03/12/88
  336. ; -----  READ THE TYPE FOR HARD DRIVE 1
  337. ;
  338.          CSRP  ED_HD1IN           ; POSITION CURSOR FOR INPUT
  339. ;
  340. ED_HD1RD:                         ; READ THE TYPE
  341.          READK ED_HD1BF           ; WAIT FOR INPUT
  342. ;
  343. ; -----  VALIDATE THE TYPE FOR HARD DRIVE 1
  344. ;
  345.          CMP   ED_HD1BL,00H       ; ONLY CARRIAGE RETURN ENTERED ?
  346.          JNE   ED_HD101           ; ...NO - CONTINUE
  347. ED_HD1E1:                         ; ERROR ROUTINE
  348.          MOV   BX,02H             ; BEEP DURATION
  349.          CALL  ED_BEEP            ; SOUND BEEP
  350.          WCS   ED_HD1IN           ; CLEAR THE FIELD
  351.          CSRP  ED_HD1IN           ; POSITION CURSOR
  352.          JMP   ED_HD1RD
  353. ED_HD101:
  354.          CMP   ED_HD1BL,01H       ; ONLY ONE CHARACTER ENTERED ?
  355.          JNE   ED_HD102           ; ...NO - CONTINUE
  356. ;
  357. ; -----  ZERO FILL THE LEADING BYTES IN THE BUFFER
  358. ;
  359.          MOV   AH,ED_HD1BD        ; GET THE DATA BYTE IN AH
  360.          MOV   WORD PTR ED_HD1BD,'00'  ; LEADING ZERO FILL
  361.          MOV   ED_HD1BD+2,AH      ; PUT THE CHAR IN BFR
  362. ED_HD102:
  363.          CMP   ED_HD1BL,02H       ; ONLY TWO CHARACTER ENTERED ?
  364.          JNE   ED_HD103           ; ...NO - CONTINUE
  365. ;
  366. ; -----  ZERO FILL THE LEADING BYTES IN THE BUFFER
  367. ;
  368.          MOV   AX,WORD PTR ED_HD1BD ; GET THE DATA BYTES IN AX
  369.          MOV   ED_HD1BD,'0'       ; LEADING ZERO FILL
  370.          MOV   WORD PTR ED_HD1BD+1,AX ; DATA BACK TO BUFFER
  371. ED_HD103:
  372. ;
  373. ; -----  VALIDATE THE CHARACTERS IN THE BUFFER
  374. ;
  375.          CMP   ED_HD1BD,'0'       ; IS IT LESS THAN '0'
  376.          JB    ED_HD1E1           ; ...YES - GO TO ERROR ROUTINE
  377.          CMP   ED_HD1BD,'2'       ; GREATER THAN 2 ?
  378.          JA    ED_HD1E1           ; ...YES - ERROR
  379. ;
  380.          CMP   ED_HD1BD+1,'0'     ; IS IT LESS THAN '0'
  381.          JB    ED_HD1E1           ; ...YES - GO TO ERROR ROUTINE
  382.          CMP   ED_HD1BD+1,'9'     ; GREATER THAN 9 ?
  383.          JA    ED_HD1E1           ; ...YES - ERROR
  384. ;
  385.          CMP   ED_HD1BD+2,'0'     ; IS IT LESS THAN '0'
  386.          JB    ED_HD1E1           ; ...YES - GO TO ERROR ROUTINE
  387.          CMP   ED_HD1BD+2,'9'     ; GREATER THAN 9 ?
  388.          JLE   ED_HD104           ; ...NO - CONTINUE
  389.          JMP   ED_HD1E1           ; ...YES - ERROR
  390. ED_HD104:
  391. ;
  392. ; -----  DIGITS ARE GOOD, CONVERT TO BINARY
  393. ;
  394.          MOV  AX,WORD PTR ED_HD1BD+1 ; GET ASCII LOW 2 BYTES
  395.          CALL  ED_CVB             ; CONVERT TO BINARY
  396.          CMP   ED_HD1BD,'2'       ; HIGH DIGIT 2 ?
  397.          JNE   ED_HD105           ; ...NO - CONTINUE
  398.          ADD   AX,200D            ; ...YES - ADD 200
  399. ED_HD105:
  400.          CMP   ED_HD1BD,'1'       ; HIGH DIGIT A 1
  401.          JNE   ED_HD106           ; ...NO - CONTINUE
  402.          ADD   AX,100D            ; YES - ADD 100
  403. ED_HD106:
  404. ;
  405.          CMP   AX,15              ; DRIVE TYPE 15 SPECIFIED ?
  406.          JNE   ED_HD107           ; ...NO - CONTINUE
  407.          JMP   ED_HD1E1           ; ...YES - ERROR
  408. ED_HD107:
  409.          CMP   AX,ED_MAXE-1       ; TYPE GT MAX EDDT TYPE ?
  410.          JLE   ED_HD109           ; ...NO - CONTINUE
  411.          JMP   ED_HD1E1           ; ...YES - ERROR
  412. ED_HD109:
  413. ;
  414. ; -----  SET THE DRIVE TYPE IN CMOS
  415. ;
  416.          MOV   ED_HD1E,AL         ; SET THE EDDT EXTENDED TYPE
  417.          CMP   AL,00H             ; NO DRIVE ?
  418.          JE    ED_FD000           ; ...YES - DO FLOPPYS
  419. ;-------------------------------------------------------------- 03/12/88
  420. ;                                                               03/12/88
  421. ;        NOTE:                                                  03/12/88
  422. ;              IN ORDER TO INITIALIZE INTERRUPT 13H ON SOME     03/12/88
  423. ;              AT COMPATIBLES FIXED DRIVE 0 MUST BE DEFINED     03/12/88
  424. ;              IN CMOS. SINCE THE ACTUAL DRIVE MAY NOT HAVE     03/12/88
  425. ;              A CORRESPONDING IBM DRIVE TYPE WE MUST PICK      03/12/88
  426. ;              ONE THAT MEETS THE FOLLOWING CRITERIA:           03/12/88
  427. ;                                                               03/12/88
  428. ;              (1) THE TYPE DEFINED MUST HAVE LESS THAT OR      03/12/88
  429. ;                  EQUAL TO THE PHYSICAL DRIVE'S NUMBER OF      03/12/88
  430. ;                  HEADS _AND_ NUMBER OF CYLINDERS.             03/12/88
  431. ;                                                               03/12/88
  432. ;              (2) IF THE PHYSICAL DRIVE HAS MORE THAN 8        03/12/88
  433. ;                  HEADS THE TYPE USED MUST HAVE A CONTROL      03/12/88
  434. ;                  BYTE VALUE OF 08H OR IT MUST NOT USE         03/12/88
  435. ;                  WRITE PRECOMPENSATION.                       03/12/88
  436. ;-------------------------------------------------------------- 03/12/88
  437. ;
  438. ; -----  LOCATE THE TABLE ENTRY FOR FIXED DRIVE 1               03/12/88
  439. ;                                                               03/12/88
  440.          XOR   BX,BX              ; CLEAR BX                    03/12/88
  441.          MOV   BL,AL              ; GET DRIVE TYPE FOR DRIVE 1  03/12/88
  442.          DEC   BX                 ; ADJUST FOR TABLE BASE       03/12/88
  443.          SHL   BX,04H             ; *10H FOR TABLE OFFSET       03/12/88
  444.          MOV   AL,BYTE PTR ED_TABLE+2[BX] ; GET NUMBER OF HEADS 03/12/88
  445.          CMP   AL,09H             ; NINE OR MORE HEADS ?        03/12/88
  446.          JNL   ED_H1GT8           ; ...YES - GO ADJUST          03/12/88
  447.          OR    ED_HDTYP,01H       ; SET DRIVE 0 TO BIOS TYPE 1  03/12/88
  448.          JMP   ED_FD000           ; DO FLOPPY'S                 03/12/88
  449. ED_H1GT8:                         ;                             03/12/88
  450.          OR    ED_HDTYP,06H       ; SET DRIVE 0 TO BIOS TYPE 6  03/12/88
  451. ED_FD000:
  452. ;
  453. ; -----  READ THE TYPE FOR FLOPPY DRIVE 0
  454. ;
  455.          CSRP  ED_FD0IN           ; POSITION CURSOR FOR INPUT
  456. ;
  457. ED_FD0RD:                         ; READ THE TYPE
  458.          READK ED_FD0BF           ; WAIT FOR INPUT
  459.          WCS   ED_INVMB           ; BLANK ERROR MESSAGE FIELD
  460. ;
  461. ; -----  VALIDATE THE TYPE FOR DRIVE 0
  462. ;
  463.          CMP   ED_FD0BL,00H       ; ONLY CARRIAGE RETURN ENTERED ?
  464.          JNE   ED_FD001           ; ...NO - CONTINUE
  465. ED_FD0E1:                         ; ERROR ROUTINE
  466.          MOV   BX,02H             ; BEEP DURATION
  467.          CALL  ED_BEEP            ; SOUND BEEP
  468.          WCS   ED_FD0IN           ; CLEAR THE FIELD
  469.          CSRP  ED_FD0IN           ; POSITION CURSOR
  470.          JMP   ED_FD0RD
  471. ED_FD001:
  472. ;
  473. ; -----  VALIDATE THE CHARACTERS IN THE BUFFER
  474. ;
  475.          CMP   ED_FD0BD,'0'       ; IS FD0 TYPE '0'
  476.          JNE   ED_FD0NZ           ; ...NO - CONTINUE
  477.          WCS   ED_INVM3           ; WRITE ERROR MESSAGE
  478.          MOV   BX,3               ; BEEP COUNT
  479.          CALL  ED_BEEP            ; BEEP THE SPEAKER
  480.          JMP   ED_FD0E1           ; GO TRY AGAIN
  481. ED_FD0NZ:
  482.          CMP   ED_FD0BD,'0'       ; IS IT LESS THAN '0'
  483.          JB    ED_FD0E1           ; ...YES - GO TO ERROR ROUTINE
  484.          CMP   ED_FD0BD,'4'       ; GREATER THAN FOUR ?
  485.          JA    ED_FD0E1           ; ...YES - ERROR
  486. ;
  487. ; -----  DIGIT IS GOOD, CONVERT TO BINARY
  488. ;
  489.  
  490.          AND   ED_FD0BD,0FH       ; CONVERT TO BINARY
  491. ;
  492. ; -----  WE NOW HAVE THE DRIVE TYPE IN AL SAVE IT IN OUR CMOS IMAGE
  493. ;
  494.          AND   ED_FDTYP,00FH      ; CLEAR ANY OLD TYPE IN CMOS
  495.          MOV   AL,ED_FD0BD        ; GET TYPE IN AX
  496.          SHL   AL,4               ; GET IN HIGH ORDER
  497.          OR    ED_FDTYP,AL        ; PUT OURS IN CMOS
  498. ;
  499. ED_FD100:
  500. ;
  501. ; -----  READ THE TYPE FOR FLOPPY DRIVE 1
  502. ;
  503.          CSRP  ED_FD1IN           ; POSITION CURSOR FOR INPUT
  504. ;
  505. ED_FD1RD:                         ; READ THE TYPE
  506.          READK ED_FD1BF           ; WAIT FOR INPUT
  507. ;
  508. ; -----  VALIDATE THE TYPE FOR DRIVE 1
  509. ;
  510.          CMP   ED_FD1BL,00H       ; ONLY CARRIAGE RETURN ENTERED ?
  511.          JNE   ED_FD101           ; ...NO - CONTINUE
  512. ED_FD1E1:                         ; ERROR ROUTINE
  513.          MOV   BX,02H             ; BEEP DURATION
  514.          CALL  ED_BEEP            ; SOUND BEEP
  515.          WCS   ED_FD1IN           ; CLEAR THE FIELD
  516.          CSRP  ED_FD1IN           ; POSITION CURSOR
  517.          JMP   ED_FD1RD
  518. ED_FD101:
  519. ;
  520. ; -----  VALIDATE THE CHARACTERS IN THE BUFFER
  521. ;
  522.          CMP   ED_FD1BD,'0'       ; IS IT LESS THAN '0'
  523.          JB    ED_FD1E1           ; ...YES - GO TO ERROR ROUTINE
  524.          CMP   ED_FD1BD,'4'       ; GREATER THAN FOUR ?
  525.          JA    ED_FD1E1           ; ...YES - ERROR
  526. ;
  527. ; -----  DIGIT IS GOOD, CONVERT TO BINARY
  528. ;
  529.  
  530.          AND   ED_FD1BD,0FH       ; CONVERT TO BINARY
  531. ;
  532. ; -----  WE NOW HAVE THE DRIVE TYPE IN AL SAVE IT IN OUR CMOS IMAGE
  533. ;
  534.          MOV   AL,ED_FD1BD        ; GET TYPE IN AL
  535.          AND   ED_FDTYP,0F0H      ; CLEAR ANY OLD TYPE IN CMOS
  536.          OR    ED_FDTYP,AL        ; PUT OURS IN CMOS
  537. ;
  538. ED_FD110:
  539. ED_YN:
  540. ;
  541. ; -----  ASK OPERATOR TO CONFIRM DATA ENTERED
  542. ;
  543.          WCS   ED_CONF            ; WRITE CONFIRMATION MESSAGE
  544. ;
  545.          MOV   AH,0CH             ; PRUGE KEYBOARD BUFFER
  546.          MOV   AL,08H             ; AND READ A CHARACTER
  547.          INT   21H                ; RUPT TO DOS
  548. ;
  549.          CMP   AL,'Y'             ; ...ANSWER YES ?
  550.          JE    ED_CMCKS           ; YES - CONTINUE
  551.          CMP   AL,'N'             ; ...ANSWER NO
  552.          JE    ED_LOOP            ; YES - DO IT AGAIN
  553.          CMP   AL,'y'             ; ...ANSWER YES ?
  554.          JE    ED_CMCKS           ; YES - CONTINUE
  555.          CMP   AL,'n'             ; ...ANSWER NO
  556.          JE    ED_LOOP            ; YES - DO IT AGAIN
  557.          JMP   ED_BADA            ; BAD ANSWER
  558. ED_LOOP: JMP   ED_GO              ; LOOP TO FAR ADDRESS (START)
  559. ED_BADA:
  560. ;
  561. ; -----  INVALID ANSWER, BEEP & TRY AGAIN
  562. ;
  563.          MOV   BX,2               ; BEEP COUNT
  564.          CALL  ED_BEEP            ; CALL BEEP ROUTINE
  565.          JMP   ED_YN              ; DO IT AGAIN
  566.  
  567. ED_CMCKS:
  568. ;
  569. ; -----  WE NOW HAVE CMOS SETUP, CHECKSUM IT
  570. ;
  571.          LEA   DX,ED_CMOS         ; GET ADDRESS OF CMOS DATA AREA
  572.          CALL  CMOSCHKS           ; CALL CHECKSUM ROUTINE
  573. ;
  574. ; -----  NOW WRITE THE CMOS BACK TO HARDWARE
  575. ;
  576.          LEA   DX,ED_CMOS         ; GET ADDRESS OF CMOS DATA AREA
  577.          CALL  CMOSWRIT           ; CALL CHECKSUM ROUTINE
  578. ;
  579.          CLS                      ; CLEAR THE SCREEN
  580. ;
  581. ; -----  RETURN TO DOS
  582. ;
  583. ED_EXIT:
  584.          MOV   AH,04CH            ; TERMINATE FUNCTION
  585.          MOV   AL,00H             ; RETURN CODE
  586.          INT   21H                ; DOS RUPT
  587. ;
  588. ; -----  SUBROUTINE TO BEEP THE SPEAKER
  589. ; -----  BX HAS A VALUE FOR DURATION OF THE BEEP
  590. ;
  591. ED_BEEP  PROC  NEAR               ; ROUTINE TO BEEP THE SPEAKER
  592.          PUSHA                    ; SAVE REGS
  593.          CLI                      ; RUPTS OFF
  594.          MOV   AL,0B6H            ; SEL TIM 2,LSB,MSB
  595.          OUT   043H,AL            ; SET TIMER MODE REG
  596.          MOV   AX,0533H           ; DIVISOR FOR 1000HZ
  597.          OUT   042H,AL            ; TIMER CNT - LSB
  598.          MOV   AL,AH              ; TIMER 2 CNT - MSB
  599.          OUT   042H,AL            ; SEND THE BYTE
  600.          IN    AL,061H            ; GET CURRENT PORT VALUE
  601.          MOV   AH,AL              ; SAVE IN AH
  602.          OR    AL,03H             ; SPEAKER ON
  603.          OUT   061H,AL            ; SEND SPKR ON VAL
  604.          SUB   CX,CX              ; ZERO CX REG
  605. ED_BEEP1:                         ; LOOP TO BEEP
  606.          LOOP  ED_BEEP1           ; LOOP 'TIL CX 0
  607.          DEC   BL                 ; COUNT DONE ??
  608.          JNZ   ED_BEEP1           ;
  609.          MOV   AL,AH              ; RESTORE SAVED VALUE
  610.          OUT   061H,AL            ; SEND TO PORT
  611.          POPA                     ; RESTORE REGS
  612.          RET                      ;
  613. ED_BEEP  ENDP                     ; END OF PROC
  614. ;
  615. ; -----  CONVERT THE CHARACTERS IN AX TO BINARY
  616. ;
  617. ED_CVB   PROC  NEAR               ; ASCII TO BINARY CONVERSION ROUTINE
  618. ;
  619. ;        NOTE :
  620. ;              THE CHARACTERS SHOULD HAVE BEEN CHECKED PREVIOUSLY
  621. ;              SO NO INPUT VALIDATION WILL BE DONE.
  622. ;
  623.          PUSH  BX                 ; SAVE BX REGISTER CONTENTS
  624.          PUSH  CX                 ; SAVE CX REGISTER CONTENTS
  625.          PUSH  SI                 ; SAVE SI REGISTER CONTENTS
  626. ;
  627.          MOV   BX,AX              ; GET AX CONTENTS IN WORK REG
  628.          AND   AX,000FH           ; SAVE ONLY THE LOW NIBBLE
  629.          MOV   SI,10              ; GET THE POSITIONAL VALUE
  630.          MUL   SI                 ; MULTIPLY AX BY 10
  631.          MOV   CL,8               ; GET SHIFT COUNT OF 8
  632.          SHR   BX,CL              ; MOVE HIGH BYTE DOWN
  633.          AND   BX,000FH           ; ISOLATE LOW ORDER DIGIT
  634.          ADD   AX,BX              ; AND ADD IT TO THE SUM
  635. ;
  636.          POP   SI                 ; RESTORE SI REGISTER
  637.          POP   CX                 ; RESTORE CX REGISTER
  638.          POP   BX                 ; RESTORE BX REGISTER
  639.          RET                      ; RETURN TO CALLER
  640. ED_CVB   ENDP                     ; END OF PROCEDURE
  641. ED_MAIN  ENDP                     ; END OF PROCEDURE
  642. ED_CODE  ENDS                     ; CODE SEGMENT END
  643.          END   ED_START
  644.